﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using Entidades.Karaoke;

namespace Datos.Karaoke
{
    public class KarServicioDAL
    { 
        public static string cnx = ConfigurationManager.ConnectionStrings["ApplicationServices"].ToString();

        private static KarServicioDAL _instance;

        public static KarServicioDAL Instance()
        {
            if (_instance == null)
            {
                _instance = new KarServicioDAL();
            }

            return _instance;
        }


        /**
         * Le envio el Tipo de servicio y el numero del recurso (box  o mesa) y devuelve el id del servicio 
         * que esta en uso actualmente
         */
        public KarServicio ObtenerServicioActual(int NroRecurso, int tipoServicio)
        {
            SqlConnection con = new SqlConnection(cnx);
            String sql = " SELECT [idServicio] FROM [BD_TP3].[dbo].[Kar_Servicio] where [idTipoServicio]= " + tipoServicio + " and [numero] = " + NroRecurso + " and [estado]=1 ORDER BY [idServicio] desc ";
            SqlCommand com = new SqlCommand(sql, con);

            System.Diagnostics.Debug.WriteLine("ObtenerServicioActual " + sql );

            com.CommandType = System.Data.CommandType.Text;
            try
            {
                con.Open();
                SqlDataReader dr = com.ExecuteReader();
                KarServicio obj = null;
                if (dr.Read())
                {
                    obj = new KarServicio();
                    obj.idServicio = Convert.ToInt32(dr["idServicio"].ToString());
                }
                dr.Close();

                return obj;
            }
            catch (Exception ex)
            {                
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }

        /** 
        */
        public KarServicio ObtenerUltimoServicioGenerado(int NroRecurso, int tipoServicio)
        {
            SqlConnection con = new SqlConnection(cnx);
            String sql = " SELECT top 1 [idServicio] FROM [BD_TP3].[dbo].[Kar_Servicio] where [idTipoServicio]= " + tipoServicio + " and [numero] = " + NroRecurso + " and [estado]=1 ORDER BY [idServicio] desc  ";
            SqlCommand com = new SqlCommand(sql, con);

            System.Diagnostics.Debug.WriteLine("ObtenerServicioActual " + sql);

            com.CommandType = System.Data.CommandType.Text;
            try
            {
                con.Open();
                SqlDataReader dr = com.ExecuteReader();
                KarServicio obj = null;
                while (dr.Read())
                {
                    obj = new KarServicio();
                    obj.idServicio = Convert.ToInt32(dr["idServicio"].ToString());
                }
                dr.Close();

                return obj;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }


        /***
         * registra el servicio una vez que se ha dado  activar
         * */
        public int registrarServicio(KarServicio servicio)
        {
            SqlConnection con = new SqlConnection(cnx);
            SqlCommand com = new SqlCommand("INSERT INTO [BD_TP3].[dbo].[Kar_Servicio] ([numero],[idTipoServicio],[fecInicio],[fecFin],[estado])" +
                                            "VALUES ( " + servicio.numero + ", " + servicio.idTipoServicio + ", getdate(), getdate() ,1)", con);
            com.CommandType = System.Data.CommandType.Text;
            Int32 respuesta = 0; 
            try
            {
                con.Open();
                respuesta += com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine( ex.Message);
                throw ex;
            }
            finally
            {
                con.Close();
            }
            int idservicio = ObtenerUltimoServicioGenerado(servicio.numero, servicio.idTipoServicio).idServicio;

            // INSERT ORDEN 
            String sql  = " insert into [BD_TP3].[dbo].[Caj_Orden] (IdOrden,IdServicio,FechaHora,Monto) " +
                                            "values("+idservicio+","+idservicio+",getdate(),100)";
            System.Diagnostics.Debug.WriteLine( sql );
            com = new SqlCommand(sql , con);
            com.CommandType = System.Data.CommandType.Text;
            try
            {
                con.Open();
                respuesta += com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw ex;
            }
            finally
            {
                con.Close();
            }
            //INSERTAR CUENTA 
            com = new SqlCommand(" insert into [BD_TP3].[dbo].[Caj_Cuenta] (IdOrden,NumeroCuenta,IdCliente,FechaHoraCuenta,SubTotal,Impuestos,Total) " +
                                            " values("+idservicio+","+idservicio+",1,getdate(),100,10,110) ", con);
            com.CommandType = System.Data.CommandType.Text;
            try
            {
                con.Open();
                respuesta += com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw ex;
            }
            finally
            {
                con.Close();
            }


            sql = " INSERT INTO [BD_TP3].[dbo].[Caj_Pago] ([IdOrden] ,[NumeroCuenta] ,[NumeroComprobante] ,[TipoComprobante] ,[IdCupon] ,[FechaHoraEmision] ,[MostrarDetallePago] ,[Total] ,[CodigoAdministrador] ,[FechaAnulacion] ,[ConceptoAnulacion]) " +
                                            "      VALUES (" + idservicio + " ," + idservicio + " ," + idservicio + " ,'BOLETA' ,'NO' ,getdate() , 0 , 100, 'ADMIN0001' , null, '' ) ";
            com = new SqlCommand( sql , con);
            System.Diagnostics.Debug.WriteLine( sql );
            com.CommandType = System.Data.CommandType.Text;
            try
            {
                con.Open();
                respuesta += com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw ex;
            }
            finally
            {
                con.Close();
            }

            return respuesta;
        }

        /***
         * actualiza el servicio cambiando el estado a 2 y clocando fecha de fin
         */
        public int finalizarServicio(int idServicio)
        {
            SqlConnection con = new SqlConnection(cnx);
            SqlCommand com = new SqlCommand("UPDATE [BD_TP3].[dbo].[Kar_Servicio] SET [fecFin]= getdate() ,[estado]=2 WHERE [idTipoServicio]= " + idServicio , con);

            com.CommandType = System.Data.CommandType.Text;
            try
            {
                con.Open();
                Int32 respuesta = com.ExecuteNonQuery();

                return respuesta;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }
    }


}
